%离散位置下的单步牵引计算 输入：状态量(v,s,t,Ts,Tr)；控制量(Fe,Fm)；
function [x_af,ploss] = cal_train_state_dx(x, u, lineStruct, trainStruct, qsStruct)
%状态量
v_st = x(1); %初始速度
x_st = x(2); %初始位置
t_st = x(3); %初始时刻
temp_st = [x(4) x(5)]; %初始温度
%控制量
fe = u(1); % 电机输出力，电牵-电制
fm = u(2); %空气制动力
% 牵引力
if fe > 0 %牵引力
    fe = min([fe getMaxFt(v_st)]);
else %电制动力
    fe = max([fe -getMaxFeb(v_st)]);
end
f_ = fe - fm;

% 计算基本运行阻力
f_rb = cal_unit_basicResist(trainStruct.abc,v_st) * trainStruct.mass * 9.81 / 1000;
% 计算线路附加阻力
f_rl = cal_unit_lineResist(x_st,lineStruct.gradient,lineStruct.curve) * trainStruct.mass * 9.81 / 1000;
% 计算加速度
a = (f_-f_rb-f_rl)/trainStruct.mass/(1+trainStruct.rf);
% 计算下一状态速度
v_ed = sqrt(v_st*v_st/3.6^2 + 2*a*qsStruct.step_x) * 3.6;
% 更新过程时间
dt = 2*qsStruct.step_x / ((v_ed + v_st)/3.6);
% 计算末时间
t_ed = t_st + dt;
% 计算末位置
x_ed = x_st + qsStruct.step_x;
% 计算海拔高度
h = getPosHeight(x_ed, lineStruct);

% 计算每个电机上的力
Fpmt = fe/lineStruct.motor_num;
% 计算损耗
[ploss(1),ploss(2),ploss(3),ploss(4)] = getmotorlossv1(Fpmt, v_kmh);
% 计算温度
[temp_ed(1), temp_ed(2)] = lptn2nodes_sr(ploss(1:2),temp_st(1:2),h,dt);

% 状态赋值
x_af = [v_ed x_ed t_ed temp_ed];